package collection;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import domain.Customer;

public class MapTest {
	public static void mapBasic(){
		//Map(Interface) - key -value 쌍으로 관리하는 collection
		//클래스 : HashTable(v1.0), HashMap(v1.2) 이제 해쉬 테이블은 잘 안쓴다.
		HashMap map = new HashMap();
		//Map 값을 추가/변경
		map.put("name", "김철수");//키값 벨류값 다 스트링
		map.put("age", 20);//20-int(x), Interger!! auto-boxing이 자동으로 실행된거임
		map.put("address", "경기도 성남시 분당구");
		map.put("weight",70.5);
		System.out.println(map);
		//값 조회 - get(key) : value
		Object o = map.get("age");
		Integer age = (Integer)o;
		Double weight = (Double)map.get("weight");//또 쓸 변수 아니면 변수는 자꾸 안만드는게 좋다. 이렇게 한방에 쓰는 연습을 하자.
		System.out.println(age+" - "+ weight);
		
		map.put("name", "이영희");//중복된 key값을 넣으면 변경
		System.out.println("변경 후  : "+ map);//변경한 값이 들어가고 전에 있던 값은 삭제
		
		//삭제? 뭐지 안된다. 왜안되는지 찾아보자
		String addr = (String)map.remove("address");
		System.out.println(addr);
		System.out.println("삭제후 : "+ map);
		
		boolean b = map.containsKey("name");
		System.out.println(b);
		
		b = map.containsValue("notebook");
		System.out.println(b);
		//아래 둘의 차이는 뭐지? 비교 확인해보자. 
		printAllkeys(map);
		printAllVallue(map);
		
	}
	//매개변수로 받은 Map의 모든 키값을 출력
	public static void printAllkeys(Map map){
		Set Keys = map.keySet();
		System.out.println(Keys);
	}
		
	public static void printAllVallue(Map map){
		Collection values = map.values();
		System.out.println(values);
	}
	
	public static void mapDomainObject(){
		Customer c1 = new Customer("id-1", "김영수", 20);
		Customer c2 = new Customer("id-2", "숭응수", 43);
		Customer c3 = new Customer("id-3", "감나수", 12);
		Customer c4 = new Customer("id-4", "허주수", 65);
		Customer c5 = new Customer("id-5", "산아더", 86);
		Customer c6 = new Customer("id-6", "마누다", 23);
		Customer c7 = new Customer("id-7", "햐뉴마", 75);
		Customer c8 = new Customer("id-8", "더후나", 24);
		Customer c9 = new Customer("id-9", "배누아", 11);
		
		HashMap map  =  new HashMap();
		map.put(c1.getId(), c1);//아이디를 받아서 그것을 키값으로 받아서 c1이라는 객체를 통째로 밸류값으러 집어 넣는다.
		map.put(c2.getId(), c2);
		map.put(c3.getId(), c3);
		map.put(c4.getId(), c4);
		map.put(c5.getId(), c5);
		map.put(c6.getId(), c6);
		map.put(c7.getId(), c7);
		map.put(c8.getId(), c8);
		
		
		//map에서 id가 id-3인 고객정보를 조회해서 있다면 그 사람의 나이를 출력
		Object id3 = map.get("id-3");		
		//id-3값을 조회를 해서 있으면 Object객체 id3에 그 값이 들어갈것이고, id-3가 없으면 null값을 리턴
		if(!(id3==null)){
			System.out.println("고객의 나이는  "+((Customer)id3).getAge()+"살");
		}else{
			System.out.println("없음");
			
		}
		
	}
	
	public static void main(String[] args) {
		mapBasic();//static이니까 그냥 불러도 되는거지, 객체 생성안하고
		mapDomainObject();
	}
	
}
